home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctjjl86.arc / ANIMATE.ARC / XORBENCH.ASM < prev    next >
Assembly Source File  |  1986-04-16  |  6KB  |  196 lines

  1. ; *** Listing 2 ***
  2. ;
  3. ;This program benchmarks exclusive-OR drivers.
  4. ;Link the XOR form_driver module to this program.
  5. ;
  6. stack    segment para stack 'STACK'
  7.     db    512 dup(0)
  8. stack    ends
  9. ;
  10. one    segment para public 'CODE'
  11.     assume    cs:one,ds:one,es:nothing
  12.     extrn    form_driver:near
  13. ;
  14. iteration_count  dw    0
  15. ;
  16. ;Lists describing image, location, and motion of 8 objects.
  17. ;
  18. form_address     dw  f0, f1, f2, f3, f3, f2, f1, f0 ;pointers to form 
  19.                             ; byte strings for
  20.                             ; each object
  21. highest_object_pointer equ (($-form_address)-2)     ;the index for the
  22.                             ; last object in 
  23.                             ; these lists
  24.                  ;in scan lines (0 - 198):
  25. row         dw 100,100,100,100,100,100,100,100 
  26.           ;in bytes (0 - 79):
  27. column         dw  32, 32, 32, 32, 32, 32, 32, 32 
  28.          ;in scan lines (0 - 198):
  29. row_increment     dw  -2,  2,  0, -2,  0,  0, -2,  2 
  30.          ;in bytes (0 - 79):
  31. column_increment dw   1,  1,  0, -1,  1, -1,  0, -1 
  32.          ;byte number on line (0-79):
  33. left_margin     dw   0,  0,  0,  0,  0,  0,  0,  0 
  34.          ;byte number on line (0-79):
  35. right_margin     dw  76, 74, 72, 70, 70, 72, 74, 76 
  36.          ;line number (0 - 198):
  37. top_margin     dw   0,  0,  0,  0,  0,  0,  0,  0 
  38.          ;line number (0 - 198):
  39. bottom_margin     dw 194,184,174,164,164,174,184,194 
  40. ;
  41. ;Form byte structures, as follows:
  42. ;    byte 1: # of scan lines in forms.
  43. ;    byte 2: # of bytes per scan line of form.
  44. ;    byte 3: first byte of image, followed by rest of bytes 
  45. ;        forming image, with bytes for top scan line, 
  46. ;        left to right, first, second scan line next, 
  47. ;        and so on.
  48. ;
  49. f0    db 6,4
  50.     db 0f0h,00fh,0f0h,00fh
  51.     db 0f0h,03fh,0fch,00fh
  52.     db 0ffh,0ffh,0ffh,0ffh
  53.     db 0f0h,0ffh,0ffh,00fh
  54.     db 0f0h,03fh,0fch,00fh
  55.     db 0f0h,00fh,0f0h,00fh
  56. f1    db 16,6
  57.     db 4 dup(6 dup(055h))
  58.     db 4 dup(6 dup(0ffh))
  59.     db 4 dup(6 dup(0aah))
  60.     db 4 dup(6 dup(055h))
  61. f2    db 26,8
  62.     db 26 dup(0ffh,0aah,0aah,055h,055h,0aah,0aah,0ffh)
  63. f3    db 36,10
  64.     db 9 dup(10 dup(0ffh))
  65.     db 3 dup(0ffh,0ffh,6 dup(0aah),0ffh,0ffh)
  66.     db 3 dup(0ffh,0ffh,0aah,4 dup(055h),0aah,0ffh,0ffh)
  67.     db 6 dup(0ffh,0ffh,0aah,055h,000h,000h,055h,0aah,0ffh,0ffh)
  68.     db 3 dup(0ffh,0ffh,0aah,4 dup(055h),0aah,0ffh,0ffh)
  69.     db 3 dup(0ffh,0ffh,6 dup(0aah),0ffh,0ffh)
  70.     db 9 dup(10 dup(0ffh))
  71. ;
  72. start    proc    far
  73.     push    ds          ;set up for return to DOS
  74.     sub    ax,ax          ; through the instruction at DS:0 set
  75.     push    ax          ; up by DOS when it loads this program
  76.     cld              ;drivers count up
  77.     push    cs
  78.     pop    ds          ;DS and CS are to be the same
  79.     mov    ax,0b800h     ;ES is to point to Color Graphics
  80.     mov    es,ax          ; Adapter's memory buffer
  81.     mov    ax,0004h      ;set 320x200 color mode
  82.     int    10h          ;
  83. ;
  84. ;Start by drawing all the images at their starting locations
  85. ;
  86.     mov    si,highest_object_pointer   ;start at last object
  87. next_initial_draw:
  88.     push    si               ;save the object index
  89.     mov    bx,[si+row]           ;get the line at which to put
  90.                        ; this object
  91.     mov    cx,[si+column]           ;get the column for this object
  92.     mov    si,[si+form_address]   ;get the address of the 
  93.                        ; object's image
  94.     call    form_driver           ;put image to screen memory
  95.     pop    si               ;restore the object index
  96.     sub    si,2               ;point to next object to draw
  97.     jns    next_initial_draw      ;if not done draw next object
  98. ;
  99. ;Set number of times to move objects
  100. ;
  101.     mov    [iteration_count],700  ;number of times to repeat 
  102.                        ; move loop
  103. ;
  104. ;For each iteration, move each object in turn by erasing it,
  105. ; moving it one increment, and drawing it at the new position.
  106. ;
  107. next_iteration:
  108.     mov    si,highest_object_pointer ;start at last object
  109. ;
  110. ;Move each object in turn.
  111. ;
  112. move_next_object:
  113. ;
  114. ;Erase the object at its present position.
  115. ;
  116.     push    si               ;exclusive-ORing an existing
  117.     mov    bx,[si+row]           ; image with itself 
  118.     mov    cx,[si+column]           ; effectively erases it
  119.     mov    si,[si+form_address]   ;
  120.     call    form_driver           ;
  121.     pop    si               ;
  122. ;
  123. ;Advance the object's row and column and adjust increments
  124. ; so the object remains within its boundaries.
  125. ;
  126. ;If adding the row increment to the row would place it outside
  127. ; its margins...
  128. ;
  129.     mov    ax,[si+row]           ;test the new line position
  130.     add    ax,[si+row_increment]  ; to see if it goes outside
  131.     cmp    ax,[si+top_margin]     ; its limit
  132.     jb    negate_row_increment   ;if outside negate increment
  133.     cmp    ax,[si+bottom_margin]  ; so that it will move towards
  134.     jbe    test_column_increment  ; its other limit
  135. ;
  136. ;...then make the row increment negative if positive and
  137. ; positive if negative.
  138. ;
  139. negate_row_increment:
  140.     neg    [si+row_increment]   ;make it move in other direction
  141. ;
  142. ;If adding the column increment to the column would place it
  143. ; outside its margins...
  144. ;
  145. test_column_increment:
  146.     mov    ax,[si+column]         ;if the column for the object
  147.     add    ax,[si+column_increment] ;would go outside its left or
  148.     cmp    ax,[si+left_margin]     ; right limits, then negate
  149.     jb    negate_column_increment  ; its increment so that it
  150.     cmp    ax,[si+right_margin]     ; will move in the opposite
  151.     jbe    add_increments         ; direction
  152. ;
  153. ;...then make the column increment negative if positive and
  154. ; positive if negative.
  155. ;
  156. negate_column_increment:
  157.     neg    [si+column_increment]     ;set to move in opposite 
  158.                      ; direction
  159. ;
  160. ;Add the increments to the row and column to arrive at the
  161. ; object's next position.
  162. ;
  163. add_increments:
  164.     mov    ax,[si+row_increment]     ;calculate the next line 
  165.     add    [si+row],ax         ; position and store it
  166.     mov    ax,[si+column_increment] ;calculate the next column 
  167.     add    [si+column],ax         ; position and store it
  168. ;
  169. ;Draw the object at the new location.
  170. ;
  171.     push    si               ;save this object index
  172.     mov    bx,[si+row]           ;find line and column no. at
  173.     mov    cx,[si+column]           ; which to place the object
  174.     mov    si,[si+form_address]   ;find addr. of object's form
  175.     call    form_driver           ;put object's image into screen
  176.     pop    si               ;restore the object index
  177. ;
  178.     sub    si,2               ;point to next object to move
  179.     jns    move_next_object       ; if not done jmp to move it
  180. ;
  181.     dec    [iteration_count]      ;count down number of times to
  182.     jnz    next_iteration           ; move all the objects
  183. ;
  184. ;Reset the mode to 80x25 color text mode.
  185. ;
  186.     mov    ax,0003h         ;before returning to DOS, set
  187.     int    10h             ; screen to 80x25 text mode
  188. ;
  189. ;Return to DOS.
  190. ;
  191.     ret                 ;return though instruction at
  192.                      ; start of PSP set up by DOS
  193. start    endp
  194. one    ends
  195.     end    start
  196.